package category

import (
	"fmt"

	appErrors "BookStack/pkg/errors"
)

// ========================== 分类相关错误 ==========================

// CategoryNotFound 分类不存在错误
func CategoryNotFound(id interface{}) error {
	return &appErrors.AppError{
		Code:    appErrors.ErrCodeCategoryNotFound,
		Message: fmt.Sprintf("分类不存在: %v", id),
	}
}

// CategoryNameExists 分类名称已存在错误
func CategoryNameExists(name string) error {
	return &appErrors.AppError{
		Code:    appErrors.ErrCodeCategoryNameExists,
		Message: fmt.Sprintf("分类名称已存在: %s", name),
	}
}

// CategoryTypeMismatch 分类类型不匹配错误
func CategoryTypeMismatch() error {
	return &appErrors.AppError{
		Code:    appErrors.ErrCodeCategoryTypeMismatch,
		Message: "分类类型不匹配",
	}
}

// CategoryCycleRef 分类循环引用错误
func CategoryCycleRef() error {
	return &appErrors.AppError{
		Code:    appErrors.ErrCodeCategoryCycleRef,
		Message: "分类循环引用",
	}
}

// CategoryHasChildren 分类下有子分类错误
func CategoryHasChildren() error {
	return &appErrors.AppError{
		Code:    appErrors.ErrCodeCategoryHasChildren,
		Message: "分类下有子分类",
	}
}

// CategoryHasContent 分类下有内容错误
func CategoryHasContent() error {
	return &appErrors.AppError{
		Code:    appErrors.ErrCodeCategoryHasContent,
		Message: "分类下有内容",
	}
}

// CategoryNameRequired 分类名称必填错误
func CategoryNameRequired() error {
	return &appErrors.AppError{
		Code:    appErrors.ErrCodeCategoryNameRequired,
		Message: "分类名称不能为空",
	}
}

// CategoryTypeRequired 分类类型必填错误
func CategoryTypeRequired() error {
	return &appErrors.AppError{
		Code:    appErrors.ErrCodeCategoryTypeRequired,
		Message: "分类类型不能为空",
	}
}

// CategoryStatusInvalid 分类状态无效错误
func CategoryStatusInvalid(status int) error {
	return &appErrors.AppError{
		Code:    appErrors.ErrCodeCategoryStatusInvalid,
		Message: fmt.Sprintf("无效的分类状态: %d", status),
	}
}

// ========================== 通用错误 ==========================

// DatabaseError 数据库错误
func DatabaseError(err error) error {
	return &appErrors.AppError{
		Code:    appErrors.ErrCodeDatabase,
		Message: err.Error(),
	}
}

// ValidationError 数据验证错误
func ValidationError(field, message string) error {
	return &appErrors.AppError{
		Code:    appErrors.ErrCodeValidation,
		Message: fmt.Sprintf("字段 %s: %s", field, message),
	}
}

// InvalidRequestError 无效请求错误
func InvalidRequestError(message string) error {
	return &appErrors.AppError{
		Code:    appErrors.ErrCodeBadRequest,
		Message: message,
	}
}

// UnauthorizedError 未授权错误
func UnauthorizedError() error {
	return &appErrors.AppError{
		Code:    appErrors.ErrCodeUnauthorized,
		Message: "未授权访问",
	}
}

// ForbiddenError 禁止访问错误
func ForbiddenError() error {
	return &appErrors.AppError{
		Code:    appErrors.ErrCodeForbidden,
		Message: "无权限执行此操作",
	}
}

// InternalError 内部服务器错误
func InternalError(err error) error {
	return &appErrors.AppError{
		Code:    appErrors.ErrCodeInternal,
		Message: err.Error(),
	}
}

// WrapError 包装错误
func WrapError(err error) error {
	if err == nil {
		return nil
	}

	// 如果已经是AppError类型，直接返回
	if appErr, ok := err.(*appErrors.AppError); ok {
		return appErr
	}

	// 包装为内部错误
	return InternalError(err)
}
